/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include "FpsSkyBoxSceneNode.h"
//#include "CColladaDatabase.h"
//#include "CColladaMeshSceneNode.h"
#include "FpsColladaDatabase.h"
#include "Utils\Utils.h"
//#include "IColladaMesh.h"
//#include "SceneManager/FpsColladaDatabase.h"

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

using namespace irr;
using namespace core;
using namespace scene;
using namespace video;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//! constructor
FpsSkyBoxSceneNode::FpsSkyBoxSceneNode(const char *meshFilename, s32 id)
	: ISceneNode(NULL, NULL, id)
{
	#ifdef _DEBUG
	setDebugName("FpsSkyBoxSceneNode");
	#endif

	setAutomaticCulling(scene::EAC_OFF);
	m_box.MaxEdge.set(0,0,0);
	m_box.MinEdge.set(0,0,0);

	//m_node		=	ConstructColladaScene(meshFilename,true);
	irr::core::list<irr::scene::ISceneNodeAnimator*> anims = m_node->getAnimators();
	//if(anims.getSize()>0)
	//{
	//	irr::scene::ISceneNodeAnimator* anim = (*anims.begin());
	//	anim->getTimelineCtrl()->setLoop(true);
	//}
	
	SkyboxNodeList.reallocate(32);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

FpsSkyBoxSceneNode::~FpsSkyBoxSceneNode()
{
	if(m_node)
	{
		m_node->drop();
	}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void FpsSkyBoxSceneNode::collectSkyboxNodes(irr::scene::ISceneNode*	node)
{
	//if (node)
	//{
	//	if(node->getType() == ESNT_COLLADA_MESH)
	//	{
	//		SkyboxNodeList.push_back(node);
	//	}

	//	list<ISceneNode*> Children	=	node->getChildren();
	//	list<ISceneNode*>::Iterator childIt = Children.begin();
	//	for(; childIt != Children.end(); childIt++)
	//	{
	//		collectSkyboxNodes((*childIt));
	//	}
	//}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//! renders the node.
void FpsSkyBoxSceneNode::render()
{	
	//if (!SceneManager) {
	//	return;
	//}
	//video::IVideoDriver*		driver	=	SceneManager->getVideoDriver();
	//scene::ICameraSceneNode*	camera	=	SceneManager->getActiveCamera();

	//if (!camera || !driver || !m_node) 
	//	return;

	//collectSkyboxNodes(m_node);
	//
	//{
	//	SkyboxNodeList.sort();

	//	for(int i = 0; i < SkyboxNodeList.size(); i++)
	//	{
	//		CColladaMeshSceneNode*	meshNode	=	(CColladaMeshSceneNode*)SkyboxNodeList[i].Node;
	//		IColladaMesh*			mesh		=	(IColladaMesh*)meshNode->getMesh();

	//		matrix4 mat = meshNode->getAbsoluteTransformation();
	//		mat[12] += camera->getAbsolutePosition().X;
	//		mat[13] += camera->getAbsolutePosition().Y;
	//		mat[14] += camera->getAbsolutePosition().Z/10.0f;

	//		driver->setTransform(video::ETS_WORLD, mat);

	//		for(int i = 0; i < mesh->getMeshBufferCount(); i++)
	//		{
	//			if (!mesh->hasOutputBuffer())
	//			{
	//				mesh->onPrepareBufferForRendering(IColladaMesh::EPBS_RENDERING,
	//												  driver,
	//												  i);
	//			}

	//			scene::IMeshBuffer* mb = mesh->getMeshBuffer(i);
	//
	//			if (mb)
	//			{
	//				const video::SMaterial& material = meshNode->isReadOnlyMaterials() ? mb->getMaterial() : meshNode->getMaterial(i);
	//				
	//				driver->setMaterial(material);
	//				driver->drawMeshBuffer(mb);
	//			}

	//			if (mesh->hasOutputBuffer())
	//			{
	//				mesh->releaseProcessBuffer(driver, i);
	//			}
	//		}
	//	}

	//	SkyboxNodeList.set_used(0);
	//}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//! returns the axis aligned bounding box of this node
const core::aabbox3d<f32>& FpsSkyBoxSceneNode::getBoundingBox() const
{
	if (m_node)
	{
		return m_node->getBoundingBox();
	}

	return m_box;
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void FpsSkyBoxSceneNode::OnAnimate(irr::u32 timeMs)
{
	if (m_node)
	{
		m_node->OnAnimate(timeMs);
	}
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void FpsSkyBoxSceneNode::OnRegisterSceneNode()
{
	if (IsVisible && m_node)
		SceneManager->registerNodeForRendering(this);

	ISceneNode::OnRegisterSceneNode();
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//! Creates a clone of this scene node and its children.
ISceneNode* FpsSkyBoxSceneNode::clone(ISceneNode* newParent, ISceneManager* newManager)
{
	return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////